﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Crosland.Offline.Core;
using Crosland.Offline.Logic;
using Crosland.Offline.WinForm.Properties;

namespace Crosland.Offline.WinForm
{
    public partial class UsuarioList : Form
    {
        public UsuarioList()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Instancia de Clase que maneja la logica
        /// </summary>
        SeguridadLogic logic = new SeguridadLogic();

        /// <summary>
        /// Lista que almacena el resultado de la busqueda
        /// </summary>
        List<Usuario> list = new List<Usuario>();

        public UsuarioEdit formEdit;


        /// <summary>
        /// Permite realizar búsqueda de usuarios
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnBuscar_Click(object sender, EventArgs e)
        {
            this.Filtrar();
        }

        /// <summary>
        /// Evento de carga del formaulario
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void UsuarioList_Load(object sender, EventArgs e)
        {
            this.CargarDatos();
        }

        /// <summary>
        /// Permite realizar búsquedas
        /// </summary>
        protected void CargarDatos()
        {
            string filtro = (!string.IsNullOrEmpty(this.txtFiltro.Text)) ?
                this.txtFiltro.Text : null;

            this.list = this.logic.BuscarUsuarios(filtro);

            this.gvListado.AutoGenerateColumns = false;
            this.gvListado.DataSource = list;
                      
        }

        /// <summary>
        /// Permite realizar búsqueda de registro
        /// </summary>
        protected void Filtrar()
        {
            string filtro = this.txtFiltro.Text;

            this.gvListado.DataSource = this.list.FindAll(delegate(Usuario item)
            {
                return (item.DesNombre.Contains(filtro) || item.DesApellido.Contains(filtro) ||
                    item.DesEmail.Contains(filtro) || item.ID.Contains(filtro));
            });
        }

        /// <summary>
        /// Permite filtrar el resultado de entidades
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtFiltro_TextChanged(object sender, EventArgs e)
        {
            this.Filtrar();
        }


        /// <summary>
        /// Permite controlar el estado del filtro
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtFiltro_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down)
            {
                this.gvListado.Focus();
            }
        }

        /// <summary>
        /// Permite cambiar al modo de edicion
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gvListado_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            int indexRow = this.gvListado.CurrentCell.RowIndex;
            DataGridViewRow row = this.gvListado.Rows[indexRow];

            string id = row.Cells[0].Value.ToString();

            this.EditarRegistro(id);
        }

        /// <summary>
        /// Permite cambiar al modo de edicion
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gvListado_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                int indexRow = this.gvListado.CurrentCell.RowIndex;
                DataGridViewRow row = this.gvListado.Rows[indexRow];

                string id = row.Cells[0].Value.ToString();
                this.EditarRegistro(id);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public void GuardarCompleto()
        {
            formEdit.GrabarCompleto += new EventHandler(formEdit_GrabarCompleto);
        }

        /// <summary>
        /// Completa la operación del formulario de registro
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void formEdit_GrabarCompleto(object sender, EventArgs e)
        {
            this.CargarDatos();
        }

        /// <summary>
        /// Nuevo Registro
        /// </summary>
        /// <param name="id"></param>
        protected void EditarRegistro(string id)
        {
            formEdit = new UsuarioEdit(this);
            formEdit.CodigoRegistro = id;
            formEdit.IndEdicion = true;
            formEdit.EditarRegistro(id);
            formEdit.ShowDialog(this);
        }

        /// <summary>
        /// Nuevo registro
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNuevo_Click(object sender, EventArgs e)
        {
            this.NuevoRegistro();            
        }

        /// <summary>
        /// Permite crear un nuevo registri¡o
        /// </summary>
        protected void NuevoRegistro()
        {
            formEdit = new UsuarioEdit(this);
            formEdit.CodigoRegistro = string.Empty;
            formEdit.IndEdicion = false;

            formEdit.ShowDialog(this);   
        }

        /// <summary>
        /// Permite eliminar el registro
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsiEliminar_Click(object sender, EventArgs e)
        {
            int indexRow = this.gvListado.CurrentCell.RowIndex;
            DataGridViewRow row = this.gvListado.Rows[indexRow];

            string id = row.Cells[0].Value.ToString();
            this.EliminarRegistro(id);
        }

        /// <summary>
        /// Permite quitar el registro
        /// </summary>
        /// <param name="id"></param>
        protected void EliminarRegistro(string id)
        {
            try
            {
                DialogResult dr = MessageBox.Show(Resources.MensajeConfirmacion, Resources.TituloConfirmacion,
                MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

                if (dr == DialogResult.Yes)
                {
                    this.logic.EliminarUsuario(id, Globals.UserName);
                    this.CargarDatos();
                }
            }
            catch
            {
                MessageBox.Show(Resources.MsgErrorEliminar);
            }
        }

        /// <summary>
        /// Permite crear un nuevo registro
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsiNuevo_Click(object sender, EventArgs e)
        {
            this.NuevoRegistro();
        }

        /// <summary>
        /// Permite editar un registro
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsiEditar_Click(object sender, EventArgs e)
        {
            int indexRow = this.gvListado.CurrentCell.RowIndex;
            DataGridViewRow row = this.gvListado.Rows[indexRow];

            string id = row.Cells[0].Value.ToString();

            this.EditarRegistro(id);
        }                
    }
}
